有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing为什么Java中的侦听器相互依赖?

我写过扫雷游戏。因为我有两个监听器作为一个按钮

 class SampleClass extends MouseAdapter implements ActionListener  {

         //Some code here

          public void actionPerformed(ActionEvent event){ // Buttons listener..
               System.out.println("I came here to actionPerformed.");
               //Some Code
          }

         public void mouseClicked(MouseEvent event) { //Mouse listener..
               System.out.println("I came here to MouseClicked.");
              //Some Code
               if(event.getButton() == MouseEvent.BUTTON3){..}//If Right Mouse Button Is Clicked!!
               else if(event.getButton() == MouseEvent.BUTTON1){..}//If Left Mouse Button Is Clicked!!
         }
 }

我观察到的是,每当单击鼠标左键时,只会调用执行的操作,而不会单击鼠标。但只要单击鼠标右键,就会调用mouseClicked(与正常情况一样,不会调用actionPerformed)

但是,当我移除ActionListener时,上同时单击鼠标左键和右键的mouseClicked被称为,工作非常正常

我想,两个监听器应该是两个不同的独立线程,监听事件,但是为什么一个依赖于另一个呢


共 (2) 个答案

  1. # 1 楼答案

    AWT的MouseListenerMouseMotionListener处理有时行为非常奇怪。 但正如我所认为的,事件不应该相互干扰

    如果组件没有鼠标侦听器 然后将鼠标事件提升到父容器。这意味着你 可以不必监听父组件,但仍然可以接收 为所有孩子举办的活动。在上面的用例中,如果其他一些代码向子组件添加鼠标侦听器,那么鼠标事件将不会冒泡到父容器。 这真是个糟糕的设计

    当且仅当我正在编写JComponent或PL&;的子类时,我更喜欢使用鼠标侦听器;F,因为它们可以被其他事件侦听器覆盖。我猜这就是你的情况。一个建议是使用符合你目的的EventQueue

  2. # 2 楼答案

    没有两个侦听器互不依赖。如果按下space bar,或调用doClick或通过鼠标的left click按下Action,则JButton的属性是触发Action。这就是为什么当您用鼠标左键按JButton时,但在调用actionPerformed之前,默认情况下会调用actionperformed(假定ActionListener已向它注册),会调用mousePressed事件。并且在ActionListener未向JButton注册的情况下,MouseEvent起作用并执行所需的操作。两个侦听器彼此独立工作。事实上,操作是按正确的顺序触发的。。例如JButton如果ActionListener和MouseStener都已注册。。然后触发的操作顺序如下所示:

    1. 鼠标垫()
    2. 执行的操作()
    3. 老鼠
    4. mouseClicked()

    此代码将使您清楚地了解以下几点:

    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    class Listeners extends JFrame
    {
        public void prepareAndShowGUI()
        {
            setTitle("Listeners dependency");
            JButton button = new JButton("Click");
            button.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent evt)
                {
                    System.out.println("Action Listener has listened.");
                }
            });
            button.addMouseListener(new MouseAdapter()
            {
                public void mouseClicked(MouseEvent evt)
                {
                    System.out.println("Mouse Clicked.");
                }
                public void mousePressed(MouseEvent evt)
                {
                    System.out.println("Mouse pressed.");
                }
                public void mouseReleased(MouseEvent evt)
                {
                    System.out.println("Mouse Released.");
                }
            });
            getContentPane().add(button);
            pack();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setVisible(true);
        }
        public static void main(String stp[])
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    Listeners listen = new Listeners();
                    listen.prepareAndShowGUI();
                }
            });
        }
    }
    

    单击JButton可获得以下输出:

    Mouse pressed.
    Action Listener has listened.
    Mouse Released.
    Mouse Clicked.